#ifndef __TP5_H__
#define __TP5_H__
#include <vector>
#include "tp5Region.h"
#include "LinkRegion.h"


using namespace Torch;


class Process 
{
public:
	ImageRgb* image_in;
	char* file_name;
	
	int **red;
	int **green;
	int **blue;
	int **m_LabelImage;
	int **gray;
	//region racine de l'arbre
	Region *root;	
	
	int m_iNbLink;					//nombre de liaison créer dans le graph
	int m_iNbRegion;					//nombre de region crée pendant la division
	int m_iWidth,m_iHeight;				//taille de l'image
	int m_iSeuil1,m_iSeuil2;			//finesse de la division réglé par seuil1
							//nombre de region final reglé par seuil2

	//liste chainé comprennant les liaisons du graph
	vector<Link*>Graph;
	
	//liste chainé permettant de stocker temporairement les regions
	vector<Region*>RegionTmp;

	//fonction permettant de diviser l'image initiale en region
	//fonction recursive prennant comme parametre les 2 extremite de la diagonale principale de la region
	//void division(Region *current,int ix1,int iy1,int ix2,int iy2);

	void division(Region *current,Point p1, Point p2, int criterion);
	
	//Permet de diviser et de fusioner les différentes parties de l'image
	//Prend comme paramètre l'image qui a ete charger dans le constructeur
	//et les seuils de la division et fusion
	void segmentation(int iSeuil1,int iSeuil2,int criterion);	

	//int minimun(int a,int b);
	//int maximun(int c,int d);	
	
	//Fonctions nécessaire à la fusion
	void creation_Voisin(Region *current);
	void creation_Graph(Region *current);


	int detSigmaMin();
	int detMin();
	int detMinMoy();
	int detDiffMaxMin();

	int maxRegion(Region *R);
	int minRegion(Region *R);

	//int getSmollestMinusMax();
	
	//retourne la plus petite variance dans la region
	int getMinvar();

	//cherche la region ayant le nombre moyen de pixels le plus bas et retourne cette moyenne la
	int getMoyenneMin();
	
	//renvoie la plus petite difference max-min entre les regions
	int getSmollestMinusMax();

	void divisionParMoyenne(Region *current, Point P1,Point P2);
	
	float moyenne(Point p1, Point p2);

	void fusion(int NumLiaison );
	int **Allocation();

	void sauvegarde_Image(Region* current);
	
	void freeSpace(int **space);	
	
	void printImage(ImageRgb *img,int criterion);

	void freeTable();

	void FreeTree(Region *current);
	
	void FreeGraph();	

	double minMax(Point p1,Point p2);// fait la difference entre le pixel maximun et le pixel minimum
        double Mean(Point p1,Point p2);// calcule la moyenne des pixels dans une region dnnee

	Process(char*file_name);
	//change la couleur des pixels dans l'image
	void ChangeColor(int iX,int iY,int iRed,int iGreen,int iBlue);
	char* newName(char*oldname,char*additionName);
	int longueur(char* chaine);
	void draw(Region *current,ImageRgb *img,int iX,int iY);

};




#endif /* IMAGETP5_H_ */
